//
// Created by zhou on 2021/11/26.
//
#include <iostream>
#include <vector>
using namespace std;
struct ListNode {
         int val;
         ListNode *next;
         ListNode() : val(0), next(nullptr) {}
         ListNode(int x) : val(x), next(nullptr) {}
         ListNode(int x, ListNode *next) : val(x), next(next) {}
     };
class Solution {
public:
    ListNode* mergeTwoLists1(ListNode* l1, ListNode* l2) {
        if(l1== nullptr)return l2;
        else if(l2== nullptr)return l1;
        else if(l1->val>l2->val){
            l2->next= mergeTwoLists(l2->next,l1);
//            return l2;
        }
        else {
            l1->next= mergeTwoLists(l1->next,l2);
//            return l1;
        }
    }
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode *head;
        ListNode *p1=head=new ListNode();
        while(l1!=nullptr||l2!= nullptr){
            if(l1!= nullptr&&l2!= nullptr){
                if(l1->val<l2->val){
                    p1->next=new ListNode(l1->val);
                    p1=p1->next;
                    l1=l1->next;
                }
                else{
                    p1->next=new ListNode(l2->val);
                    l2=l2->next;
                    p1=p1->next;
                }
            }
            else if(l1== nullptr){
                p1->next=new ListNode(l2->val);
                p1=p1->next;
                l2=l2->next;
            }
            else if(l2== nullptr){
                p1->next=new ListNode(l1->val);
                l1=l1->next;
                p1=p1->next;
            }
        }
        return head->next;
    }
};
int main(){
    Solution solution;
    ListNode *p1=new ListNode(2);
    p1->next=new ListNode(3);
    ListNode *p2=new ListNode(1);
    p2->next=new ListNode(4);
    ListNode *p3=solution.mergeTwoLists1(p1,p2);
    while(p3!= nullptr){
        cout<<p3->val;
        p3=p3->next;
    }
}

